LGTMoon Scala Play 機能テスト
Scala Functional Testing With Scala Test - 2.8.x
Playには機能テストに便利なメソッドやクラスがある。
play.api.test
Helpers object
ScalaTest と Specs2 について
Specs2 から ScalaTest への移行ガイド | Developers.IO
Scala Testing With Specs2 - 2.8.x
普通にテストを書く場合
test ディレクトリを作成
code:scala
package test.unit.controller
import org.specs2.mutable._
class ImageControllerTest extends Specification {
"recent" should {
"画像を返す" in {
"Hello Workd" must have size 10
}
}
}
テストの実行
code:sh
$ sbt test
info Loading settings for project lgtmoon-build from plugins.sbt ... info Loading project definition from /Users/yoshiyuki_sakamoto/lgtmoon/project info Loading settings for project root from build.sbt ... info Set current project to lgtm-scala (in build file:/Users/yoshiyuki_sakamoto/lgtmoon/) error 'Hello Workd' doesn't have size 10 but size 11 (ImageControllerTest.scala:8) info Total for specification ImageControllerTest info 1 example, 1 failure, 0 error error Failed: Total 1, Failed 1, Errors 0, Passed 0 error test.unit.controller.ImageControllerTest error (Test / test) sbt.TestsFailedException: Tests unsuccessful error Total time: 8 s, completed 2020/09/19 10:25:41 ControllerComponents not set!
code:sh
error java.util.NoSuchElementException: ControllerComponents not set! Call setControllerComponents or create the instance with dependency injection. (Controller.scala:199) InjectedController を継承している場合は多分なんかやる必要あり
[Scala Functional Testing With Scala Test - 2.8.x
これはScalaTestだったので違いそうだった
Scala Functional Testing With Specs2 - 2.8.x
inMemoryDatabase と WithApplication をつかってテストしようと思ったが
code:sh
error - database.ImageDatabase - ImageDatabase.recentIdsでエラー create table してないからかしら
DBの設定がそのまんまだから普通に失敗しているっぽい
DBの設定を書き換える必要がある?
Scala Testing With Databases - 2.8.x
データーベースをインメモリなやつに置き換えたい
application.conf を上書きしたりする必要あるけどどうしたら
Guice DIとSlickでScalaTestを実行するには?
結局この記事が一番役に立ったかも
こういうことか?って思ったけど違った
code:scala
def appWithMemoryDatabase = new GuiceApplicationBuilder()
.configure(inMemoryDatabase("default")).build()
"ImageRepositoryから返ってきた画像をそのまま返す" in new WithApplication(appWithMemoryDatabase) {
code:sh
Future(<not completed>)error - database.ImageDatabase - ImageDatabase.recentIdsでエラー java.sql.SQLException: db - Interrupted during connection acquisition
Play/Slick: How can I actually use an inMemoryDatabase in my tests? : scala
これでいけた
build.sbt で H2 ドライバをインストールする
default の設定を上書きする
コネクションプールを無効にする
postgres にしたほうがいい?
code:scala
val app = new GuiceApplicationBuilder()
.configure(
Configuration.from(
Map(
"slick.dbs.default.driver" -> "slick.driver.H2Driver$",
"slick.dbs.default.db.driver" -> "org.h2.Driver",
"slick.dbs.default.db.url" -> "jdbc:h2:mem:",
"slick.dbs.default.db.connectionPool" -> "disabled",
)
)
)
.build()
"ImageRepositoryから返ってきた画像をそのまま返す" in new WithApplication(app) {
色々調べてみると、Evolution を使ってテーブルを使っている例があったので、軽くマイグレーションについて調べてみる。
これでいけそう
scala - How to apply manually evolutions in tests with Slick and Play! 2.4 - Stack Overflow
TODO evolution をインストールする
コレに書いてあるとおり evolution をいれる
ググってもいい感じの方法が出てこない
slick-migration-api というのはどうだろう
なんか微妙な気がした
もう普通にcreate table流したらいいのでは
結局コレ?
Scala Testing With Databases - 2.8.x
Custon evolutions ってのて好きな Evolution を流せる
applyEvolutions
val database = Databases.inMemory() 的なやり方が説明されているけど、そもそも import play.api.db.Databases がないんだけど
コレの一番下の DDL をやるのはどうか
schema.create はなんか implicit 的なやつっぽい
なにかを import しなきゃ使えないっぽいけど何を import すればいいんだ
codegen 生成し直したけど効果なし
理解した。こうすれば良い(たぶん)
code:scala
object TablesForTest extends Tables {
val profile = slick.jdbc.H2Profile
}
// で、
val dbUrl = "jdbc:h2:mem:play"
val db = Database.forURL(dbUrl)
db.run(DBIO.seq(TablesForTest.schema.create))
なんか出た
;DB_CLOSE_DELAY=-1
コレをつけないとコネクションが閉じたときにデータが消えるらしいので、つけるようにする
code:scala
val dbUrl = "jdbc:h2:mem:play;DB_CLOSE_DELAY=-1"
何故か今まで出てなかった「ユーザー名またはパスワードが不正です」
code:sh
error - database.ImageDatabase - ImageDatabase.recentIdsでエラー org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: ユーザ名またはパスワードが不正です